perm filename SAY2.SAI[8,ALS] blob
sn#039842 filedate 1973-05-04 generic text, type T, neo UTF8
00100 COMMENT ⊗ VALID 00002 PAGES
00200 RECORD PAGE DESCRIPTION
00300 00001 00001
00400 00002 00002 BEGIN "SAY"
00500 00007 ENDMK
00600 ⊗;
00100 BEGIN "SAY"
00200 DEFINE ⊂="COMMENT"; ⊂ 5/1/73 Runs SIG from FIX output;
00250 ⊂ This version smooths data using routine update after each ripple;
00300 REQUIRE "COMSUB.HDR[SYS,ALS]" SOURCE_FILE;
00400 REQUIRE "SIG3[8,ALS]" LOAD_MODULE;
00500 REQUIRE "BLOCKS.HDR[SYS,THO]" SOURCE_FILE;
00600 EXTERNAL FORTRAN PROCEDURE SIG(REFERENCE INTEGER P);
00700 INTEGER ARRAY LFILE[0:'177];
00800 INTERNAL INTEGER ARRAY INDATA[0:768];
00900 INTERNAL INTEGER H,I,J,K,L,M,N,P,NF;
01000 INTERNAL INTEGER FLAG,TFLAG,UPCNT;
01100 INTERNAL INTEGER SEGC,INTOT,SEGTOT,HINT,BPT,INFLAG;
01200 INTEGER HINCNT,HCOUNT,HINDEX,EOF,EOFA,BRK;
01300 STRING PREHINT;
01400 INTEGER CHAN1,CHAN2,CHAN3,CHAN4,CHAN5;
01500 STRING READ1,FILEL,FILEI,TFILE,TFILEI,FILLST;
01600 LABEL START,ZZZZ,ZZZ,ZZ;
01700 DEFINE ⊂="COMMENT",CR="'15",LF="'12",TB="'11";
01800 DEFINE CRLF="CR&LF", CRLF0="CR&'177&'21"; ⊂ FOR CRLF W/O FORM FEED;
01900 BOOLEAN ER;
02000
02010 INTEGER EOFB,RL;
02020 INTERNAL INTEGER STX,STXX;
02030 STRING FILSTR,SNAMES,SNAME;
02040
02050 INTEGER PROCEDURE UPDATE;
02052 BEGIN "UPDATE"
02054
02056 COMMENT This procedure smooths the output values by adding data
02058 taken from adjacent entries. At the present the central location
02060 data is weighted 8 to 1 for the 4 nearest neighbors for
02062 P2 tables and 16 to 1 for the 6 nearest neighbors for P3
02064 tables. This routine works only for P tables;
02066
02068 INTEGER I,J,K,L,M,N,P,Q,R,Z;
02070 INTEGER GOOD,BAD,PLACE;
02072
02074
02076 FOR I←STXX+10 STEP 74 UNTIL STX-64 DO BEGIN
02078
02079 IF TABLES[I-9]=0 THEN DONE;
02080 PLACE←POINT(3,TABLES[I-9],5);
02082
02084 IF PLACE=2 THEN BEGIN
02086
02088 FOR J←0 STEP 1 UNTIL 7 DO
02090 FOR K←0 STEP 1 UNTIL 7 DO BEGIN
02092 N←J*8+K;
02094 GOOD←POINT(16,TABLES[I+N],31);
02096 L←LDB(GOOD);
02098 BAD←POINT(16,TABLES[I+N],15);
02100 Z←L+LDB(BAD);
02102
02104 L←L LSH 3; Z←Z LSH 3;
02106
02108 IF J>0 THEN BEGIN
02110 GOOD←POINT(16,TABLES[I+N-8],31); L←L+LDB(GOOD);
02112 BAD←POINT(16,TABLES[I+N-8],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02114
02116 IF J<7 THEN BEGIN
02118 GOOD←POINT(16,TABLES[I+N+8],31); L←L+LDB(GOOD);
02120 BAD←POINT(16,TABLES[I+N+8],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02122
02124 IF K>0 THEN BEGIN
02126 GOOD←POINT(16,TABLES[I+N-1],31); L←L+LDB(GOOD);
02128 BAD←POINT(16,TABLES[I+N-1],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02130
02132 IF K<7 THEN BEGIN
02134 GOOD←POINT(16,TABLES[I+N+1],31); L←L+LDB(GOOD);
02136 BAD←POINT(16,TABLES[I+N+1],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02138
02140 M←((L LSH 4)/Z+1)/2; IF M≥8 THEN M←7;
02142
02144 Q←POINT(32,TABLES[I+N],31);
02146 TABLES[I+N]←(LDB(Q) LSH 4)+M;
02148
02150 END;
02152
02154 END ELSE IF PLACE =3 THEN BEGIN
02156
02158 FOR J←0 STEP 1 UNTIL 3 DO
02160 FOR K←0 STEP 1 UNTIL 3 DO BEGIN
02162 R←J*4+K;
02164 FOR P←0 STEP 1 UNTIL 3 DO BEGIN
02166 N←R*4+P;
02168 GOOD←POINT(16,TABLES[I+N],31);
02170 L←LDB(GOOD);
02172 BAD←POINT(16,TABLES[I+N],15);
02174 Z←L+LDB(BAD);
02176
02178 L←L LSH 4; Z←Z LSH 4;
02180
02182 IF J>0 THEN BEGIN
02184 GOOD←POINT(16,TABLES[I+N-16],31); L←L+LDB(GOOD);
02186 BAD←POINT(16,TABLES[I+N-16],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02188
02190 IF J<3 THEN BEGIN
02192 GOOD←POINT(16,TABLES[I+N+16],31); L←L+LDB(GOOD);
02194 BAD←POINT(16,TABLES[I+N+16],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02196
02198 IF K>0 THEN BEGIN
02200 GOOD←POINT(16,TABLES[I+N-4],31); L←L+LDB(GOOD);
02202 BAD←POINT(16,TABLES[I+N-4],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02204
02206 IF K<3 THEN BEGIN
02208 GOOD←POINT(16,TABLES[I+N+4],31); L←L+LDB(GOOD);
02210 BAD←POINT(16,TABLES[I+N+4],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02212
02214 IF P>0 THEN BEGIN
02216 GOOD←POINT(16,TABLES[I+N-1],31); L←L+LDB(GOOD);
02218 BAD←POINT(16,TABLES[I+N-1],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02220
02222 IF P<3 THEN BEGIN
02224 GOOD←POINT(16,TABLES[I+N+1],31); L←L+LDB(GOOD);
02226 BAD←POINT(16,TABLES[I+N+1],15); Z←Z+LDB(BAD)+LDB(GOOD); END;
02228
02230 M←((L LSH 4)/Z+1)/2; IF M≥8 THEN M←7;
02232 Q←POINT(32,TABLES[I+N],31);
02234 TABLES[I+N]←(LDB(Q) LSH 4)+M;
02236
02238 END;
02240 END;
02242
02244 END;
02246
02248 END;
02250
02252 END "UPDATE";
02280
02290 STRING PROCEDURE HEADER;
02300 BEGIN "HEADER"
02400 STRING H1,H2; INTEGER I,J,K;
02500 IF HCOUNT>0 THEN BEGIN HCOUNT←HCOUNT-1; HINCNT←HINCNT+1; RETURN(PREHINT) END
02600 ELSE WHILE HCOUNT=0 DO BEGIN "XX"
02700 I←LFILE[HINDEX]; K←LDB(POINT(7,I,30)); J←SEGC-K;
02800 IF I=0 THEN BEGIN PREHINT←"NU"; HCOUNT←99; RETURN(PREHINT) END;
02900 IF J ≥ 0 THEN BEGIN "LATCH" H1←CVXSTR(LDB(POINT(12,I,11)) LSH 24);
03000 H2←CVXSTR(LDB(POINT(12,I,23)) LSH 24);
03100 IF EQU(H1,H2) THEN BEGIN PREHINT←H1; HCOUNT←LDB(POINT(5,I,35));
03200 HCOUNT←HCOUNT-J; HINDEX←HINDEX+1; HINCNT←HINCNT+1; RETURN(PREHINT); DONE END
03300 ELSE BEGIN PREHINT←"NU"; HCOUNT←LDB(POINT(5,I,35));
03400 HCOUNT←HCOUNT-J; HINDEX←HINDEX+1; RETURN(PREHINT); DONE; END;
03500 END "LATCH";
03600 PREHINT←"NU"; RETURN(PREHINT); END "XX";
03700 END "HEADER";
03800 STDBRK(1);
03900 SETBREAK(14,"∃",NULL,"INS");
04000
04100 FILEL←"LIST1.L0";
04200 FILEI←"TOO1.DAT[1,THO]"; M←8; INFLAG←0;
04300 CHAN1←1; CHAN2←2; CHAN3←3; CHAN4←4; CHAN5←5;
04400 TABIN(INTOT);
04500
04510 FILSTR←STRIN("Ripple learn break-point list (STFILE.TMP) =");
04520 IF FILSTR="" THEN FILSTR←"STFILE.TMP";
04530 CLOSE(CHAN5); OPEN(CHAN5,"DSK",1,2,0,3500,BRK,EOFB);
04540 LOOKUP(CHAN5,FILSTR,ER);
04550 WHILE ER DO BEGIN OUTSTR(CRLF&"Can not find "&FILSTR&
04560 " File = ");
04570 LOOKUP(CHAN5,FILSTR←INCHWL,ER); END;
04580 SNAMES←INPUT(CHAN5,14);
04590 SNAME←SCAN(SNAMES,1,J);
04592 FOR I←19 STEP 1 UNTIL 125 DO BEGIN
04594 IF LIST[I]=CVSIX(SNAME) THEN DONE;
04596 END;
04597 OUTSTR("I="&CVS(I)&" SNAME="&CVXSTR(LIST[I])&CRLF);
04598 STX←I*74; EOFB←0;
04599
04600 FILEL←STRIN("Data file list (LNFILE.TMP) = ");
04602 IF FILEL="" THEN FILEL←"LNFILE.TMP";
04625 START:
04650 WHILE EOFB=0 DO BEGIN "RIPPLE"
04660 IF SNAME="END" THEN DONE;
04700 CLOSE(CHAN5); OPEN(CHAN5,"DSK",1,2,0,3500,BRK,EOFA);
04800 LOOKUP(CHAN5,FILEL,ER); WHILE ER DO BEGIN OUTSTR(CRLF&"Can't find "&FILEL&
04900 " File = "); LOOKUP(CHAN5,FILEL←INCHWL,ER); END; EOFA←0;
05000 M←8; N←2↑M; NF←2*N;
05100
05200 FILLST←INPUT(CHAN5,14); EOFA←0;
05300
05415 OUTSTR(CRLF&"Ripple learn starting with "&SNAME&" up to ");
05420 STXX←STX; SNAME←SCAN(SNAMES,1,J);
05425 OUTSTR(SNAME&CRLF);
05430 IF SNAME="" THEN DONE;
05450 FOR I←19 STEP 1 UNTIL 125 DO BEGIN
05460 IF LIST[I]=CVSIX(SNAME) THEN DONE; END;
05462 STX←I*74;
05465 OUTSTR("I="&CVS(I)&" SNAME="&CVXSTR(LIST[I])&CRLF);
05467 RL←0;
05480
05490
05500 WHILE EOFA=0 DO BEGIN "LISTREAD"
05600 HINDEX←21; HCOUNT←HINCNT←0;
05700 FILEI←SCAN(FILLST,1,J);
05800 IF FILEI="" THEN DONE;
05900
06000 CLOSE(CHAN4);
06100 OPEN(CHAN4,"DSK",'10,10,0,0,0,EOF);
06200 LOOKUP(CHAN4,FILEI,0);
06300 IF EOF≠0 THEN DONE;
06400 ARRYIN(CHAN4,LFILE[0],'200); ⊂ Input header;
06500 SEGTOT←(LFILE[0]*6)%N;
06600 OUTSTR(FILEI&" "&CVS(SEGTOT)&" seg. ");
06700 ARRYIN(CHAN4,INDATA[0],SEGTOT*4);
06800 CLOSE(CHAN4);
06900 BPT←POINT(6,INDATA[0],-1);
07000 ZZ: HINDEX←21; HCOUNT←HINCNT←0;
07100
07200 FOR SEGC←1 STEP 1 UNTIL SEGTOT DO BEGIN
07300 READ1←HEADER;
07400 J←CVSIX(READ1);
07500 FOR I←0 STEP 1 UNTIL 63 DO BEGIN IF PHLIST[I]=0 THEN BEGIN
07600 OUTSTR("Hint not identified for segment = "&READ1&" " &CVS(SEGC)&CRLF);DONE END;
07700 IF PHLIST[I]=J THEN BEGIN HINT←H←I;TABLES[2]←HLIST[I] ; DONE ; END;
07800 END;
07900
08000 FOR P←0 STEP 1 UNTIL 23 DO INDAT[P]←ILDB(BPT);
08100 ZZZZ: SIG(P);
08200 ZZZ: END;
08300
08400 OUTSTR(CVS(HINCNT)&" hints . ");
08450 IF RL=0 THEN RL←1 ELSE BEGIN RL←0; OUTSTR(CRLF); END;
08500 IF EOFA≠0 THEN DONE;
08600 END "LISTREAD";
08650 UPDATE;
08700 TABOUT;
08800 OUTSTR("Tables saved"&CRLF);
08810
08820 END "RIPPLE";
08900
09000 END "SAY";